using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;

using ProyectoFinal.Controles;

namespace ProyectoFinal.HandlerDB
{

    //public enum SIDU
    //{
    //    SELECT,
    //    INSERT,
    //    DELETE,
    //    UPDATE

    //}

    //public enum TypeClass
    //{
    //    CURSO,
    //    FACULTAD,
    //    USUARIO,
    //    PLAN

    //}

    public class HandlerDataBase
    {
        private string cnstring;

        public HandlerDataBase(string str)
        {
            this.cnstring = str;

        }

        public DataTable ExecuteWithResult(string nom_table, string nom_proc, List<Parametro> t_params)
        { 
            DataTable dt = new DataTable();
            
            Procedimiento sp = new Procedimiento(nom_proc,this.cnstring);

            try
            {
                if (t_params != null)
                {
                    foreach (Parametro p in t_params)
                    {
                        sp.Agregar(p.nombre_col, p.val_col, p.tipo);
                    }

                    return sp.EjecutarConResultados();
                }
                else
                    return sp.EjecutarConResultados();
            }
            catch (Exception ex)
            {

                throw new Exception(ex.Message);
            }
            
        }

        public DataTable ExecuteWithResult(string nom_proc, List<Parametro> t_params)
        {
            DataTable dt = new DataTable();

            Procedimiento sp = new Procedimiento(nom_proc, this.cnstring);

            try
            {
                if (t_params != null)
                {
                    foreach (Parametro p in t_params)
                    {
                        sp.Agregar(p.nombre_col, p.val_col, p.tipo);
                    }

                    return sp.EjecutarConResultados();
                }
                else
                    return sp.EjecutarConResultados();
            }
            catch (Exception ex)
            {

                throw new Exception(ex.Message);
            }

        }

        //static public SqlDataReader ExecuteWithResult(string nom_proc, List<Parametro> t_params)
        //{
        //    DataTable dt = new DataTable();

        //    Procedimiento sp = new Procedimiento(nom_proc);

        //    try
        //    {
        //        if (t_params != null)
        //        {
        //            foreach (Parametro p in t_params)
        //            {
        //                sp.Agregar(p.nombre_col, p.val_col, p.tipo);
        //            }

        //            return sp.EjecutarConResultados();
        //        }
        //        else
        //            return sp.EjecutarConResultados();
        //    }
        //    catch (Exception ex)
        //    {

        //        throw new Exception(ex.Message);
        //    }

        //}


        //static public SqlDataReader ExecuteWithOneResult(string nom_table, string nom_proc)
        //{


        //    Procedimiento sp = new Procedimiento(nom_proc);

        //    try
        //    {

        //        return sp.EjecutarOneResultados();
        //    }
        //    catch (Exception ex)
        //    {

        //        throw new Exception(ex.Message);
        //    }

        //}


        public SqlDataReader ExecuteWithOneResult(string nom_table, string nom_proc,List<Parametro> t_params)
        {

            SqlDataReader rdr;

            Procedimiento sp = new Procedimiento(nom_proc,this.cnstring);

                
            try
            {
                foreach (Parametro p in t_params)
                {
                    sp.Agregar(p.nombre_col, p.val_col, SqlDbType.NVarChar);
                }

                rdr = sp.EjecutarOneResultados();
            
                
                return rdr;
            }
            catch (Exception ex)
            {

                throw new Exception(ex.Message);
            }

        }

        public Boolean ExecuteWithoutResult(object obj, TypeClass type_class, SIDU type_sidu)
        {
            
            object class_object;
            Procedimiento sp = new Procedimiento(this.cnstring);


            try{
                    switch (type_class)
                    { 
                        case TypeClass.CURSO:
                            class_object = (Curso)obj;
                            
                            switch (type_sidu)
                            { 
                                case SIDU.INSERT:
                                    sp = new Procedimiento("InsertCommandCurso",this.cnstring);
                               
                                    sp.Agregar("nombre", ((Curso)class_object).nombre, SqlDbType.VarChar);
                                    sp.Agregar("Objetivo", ((Curso)class_object).objetivo, SqlDbType.VarChar);
                                    sp.Agregar("silabo", ((Curso)class_object).silabo, SqlDbType.VarChar);
                                    sp.Agregar("creditos", ((Curso)class_object).creditos, SqlDbType.Int);
                                    sp.Agregar("horas_teoricas", ((Curso)class_object).h_teoricas, SqlDbType.Int);
                                    sp.Agregar("horas_practicas", ((Curso)class_object).h_practicas, SqlDbType.Int);
                                    //sp.Agregar("fk_prerrequisito", (((Curso)class_object).fk_prerrequisito == null ? System.DBNull: ((Curso)class_object).fk_prerrequisito), SqlDbType.Int);
                                    //sp.Agregar("fk_equivalente", (((Curso)class_object).fk_equivalente == null ? null : ((Curso)class_object).fk_equivalente), SqlDbType.Int);
                                    sp.Agregar("fk_prerrequisito", ((Curso)class_object).fk_prerrequisito, SqlDbType.Int);
                                    sp.Agregar("fk_equivalente", ((Curso)class_object).fk_equivalente , SqlDbType.Int);
                                    
                                    sp.Agregar("fk_facultad", ((Curso)class_object).fk_facultad, SqlDbType.Int);
                                    break;
                                    ;
                                case SIDU.UPDATE:
                                    sp = new Procedimiento("UpdateCommandUsuario",this.cnstring);

                                     sp.Agregar("Original_codigo", ((Curso)class_object).codigo, SqlDbType.Int);
                                    sp.Agregar("nombre", ((Curso)class_object).nombre, SqlDbType.VarChar);
                                    sp.Agregar("Objetivo", ((Curso)class_object).objetivo, SqlDbType.VarChar);
                                    sp.Agregar("silabo", ((Curso)class_object).silabo, SqlDbType.VarChar);
                                    sp.Agregar("creditos", ((Curso)class_object).creditos, SqlDbType.Int);
                                    sp.Agregar("horas_teoricas", ((Curso)class_object).h_practicas, SqlDbType.Int);
                                    sp.Agregar("horas_practicas", ((Curso)class_object).h_practicas, SqlDbType.Int);
                                    sp.Agregar("fk_prerrequisito", ((Curso)class_object).fk_prerrequisito, SqlDbType.Int);
                                    sp.Agregar("fk_equivalente", ((Curso)class_object).fk_equivalente, SqlDbType.Int);
                                    sp.Agregar("fk_facultad", ((Curso)class_object).fk_facultad, SqlDbType.Int);
                                    break;

                                case SIDU.DELETE:
                                    sp = new Procedimiento("DeleteCommandUsuario", this.cnstring);

                                    sp.Agregar("Original_codigo", ((Curso)class_object).codigo, SqlDbType.Int);

                                    break;    
                            }

                            break;

                        case TypeClass.PLAN:
                            class_object = (Plan)obj;
                            switch (type_sidu)
                            {
                                case SIDU.INSERT:
                                    sp = new Procedimiento("InsertCommandPlan", this.cnstring);

                                    sp.Agregar("nombre", ((Plan)class_object).nombre, SqlDbType.VarChar);
                                    sp.Agregar("fk_facultad", ((Plan)class_object).fk_facultad, SqlDbType.Int);
                                    break;
                                case SIDU.UPDATE:
                                    sp = new Procedimiento("UpdateCommandPlan", this.cnstring);

                                    sp.Agregar("nombre", ((Plan)class_object).nombre, SqlDbType.VarChar);
                                    sp.Agregar("fk_facultad", ((Plan)class_object).fk_facultad, SqlDbType.Int);
                                    break;

                                case SIDU.DELETE:
                                    sp = new Procedimiento("DeleteCommandPlan", this.cnstring);

                                    sp.Agregar("Original_codigo", ((Plan)class_object).codigo, SqlDbType.Int);
                                    break;
                            }
                            break;
                            
                    } /*end switch*/

                sp.EjecutarNoResultados();

                return true;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
                return false;
            }
               
        }
    }
}



